package ar.edu.utn.frgp.banco.business.Implements;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import ar.edu.utn.frgp.banco.business.Interfaces.IntPrestamosBusiness;
import ar.edu.utn.frgp.banco.dao.Implements.ImpCuenta;
import ar.edu.utn.frgp.banco.dao.Implements.ImpClientes;
import ar.edu.utn.frgp.banco.dao.Implements.ImpMovimientos;
import ar.edu.utn.frgp.banco.dao.Implements.ImpPrestamos;
import ar.edu.utn.frgp.banco.domain.Prestamos;
import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.domain.Cliente;
import ar.edu.utn.frgp.banco.domain.Movimiento;

public class ImpPrestamosBusiness implements IntPrestamosBusiness {

	@Override
	public boolean CrearPrestamo(Integer id_cliente, Integer id_cuenta,
			Integer cancuotas, Double monto) throws Exception {
		try{
			
		//Valido Cliente
		Cliente cliente = new Cliente();
		ImpClientes clientedao = new ImpClientes();
		cliente = clientedao.ObtenerCliente(id_cliente);
		if(cliente == null){
			throw new Exception ("El cliente es inexsistente.");
		}
		
		//Valido cuenta
		Cuenta cuenta = null;
		ImpCuenta cuentadao = new ImpCuenta();
		
		if (id_cuenta != null && id_cuenta > 0){
			cuenta = cuentadao.TraerCuenta(id_cuenta);
			if(cuenta != null){
				if (cuenta.getID_Cliente() != id_cliente){
					throw new Exception ("La cuenta no corresponde al cliente seleccionado");
				}
			}
			else{
				throw new Exception ("La cuenta es inexistente.");
			}
		}

		//Valido monto
		if(monto < 5000){
			throw new Exception ("El momnto minimo para un prestamo es $5000.");
		}
		
			
		//Genero el prestamo
		//Alta en el regsitro del prestamo
		Prestamos prestamo = new Prestamos();
		ImpPrestamos prestamosdao = new ImpPrestamos();
		
		prestamo.setId_cliente(id_cliente);
		prestamo.setCantidadCuotas(cancuotas);
		prestamo.setFecha(new Date());
		prestamo.setId_cuenta(id_cuenta);
		
		if(cuenta == null){
			prestamo.setInteres(0.15);
		}else{
			prestamo.setInteres(0.1);
			
		}
		prestamo.setMonto(monto);
		prestamosdao.AltaPrestamo(prestamo);
		
		
		//Alta en el movimiento solo si tiene cuenta
		if (cuenta != null){
			Movimiento movimientodebito = new Movimiento();
			ImpMovimientos movimientosdao = new ImpMovimientos();
			
			movimientodebito.setFecha(new Date());
			movimientodebito.setId_cuenta(cuenta.getID_Cuenta());
			movimientodebito.setOrigen(movimientodebito.ORIGEN_PRESTAMO);
			movimientodebito.setMonto(monto);
			movimientodebito.setSaldoActual(cuenta.getSaldo()+monto);
			movimientodebito.setTipoMov(movimientodebito.TIPOMOVIMIENTO_DEPOSITO);
			movimientosdao.AltaMovimiento(movimientodebito);

			//Modifico el saldo de la cuenta
			cuenta.setSaldo(cuenta.getSaldo()+monto);
			cuentadao.ModiCuenta(cuenta);
		}
		return false;
		} catch (Exception e){
			throw new Exception(e.getMessage()); //ENVIO DE ECEPCIONES
		}
	}
}
